from django.db import models


# Create your models here.
# 创建应用的表结构,全部继承django中的models.Model来创建
# 创建或修改的表结构，都要用数据迁移命令来执行一次
#   1.python manage.py makemigrations
#   2.python manage.py migrate


class Department(models.Model):
    """
    部门表
    verbose_name：注解
    """
    title = models.CharField(verbose_name='部门名称', max_length=32)

    # 定制在前端要显示的内容，用于在前端关联查询的结果，不然会返回一个对象
    # 这个显示会在ModelForm中使用到
    def __str__(self):
        return self.title


class UserInfo(models.Model):
    """
    员工表
    """
    name = models.CharField(verbose_name='姓名', max_length=16)
    password = models.CharField(verbose_name='密码', max_length=64)
    age = models.IntegerField(verbose_name='年龄')

    # max_digits最大几位数，decimal_places小数点后几位，default默认值为0
    account = models.DecimalField(verbose_name='帐户余额', max_digits=10, decimal_places=2, default=0)

    # create_time = models.DateTimeField(verbose_name='入职时间')
    create_time = models.DateField(verbose_name='入职时间')

    # 有约束
    # 创建一个与Department表id有约束关系的列
    # 在Django底层会将depart变量自动生成列名为depart_id的字段名
    # 1.有约束并且级联删除
    #    - to ：关联哪个表
    #    - to_field ： 关联哪个字段
    #    - on_delete=models.CASCADE : 级联删除，部门删除后，该部门的员工也删除
    depart = models.ForeignKey(verbose_name='部门ID', to='Department', to_field='id', on_delete=models.CASCADE)

    # 2.有约束，可以置空，删除部门后，员工不删除，并且将列置空
    #    - null=True,blank=True 该列可以为空
    #    - on_delete=models.SET_NULL 该列可以为空
    # depart = models.ForeignKey(verbose_name='部门ID', to='Department', to_field='id', null=True,blank=True,on_delete=models.SET_NULL)

    # 在django中做约束
    # 定义一个元组
    # 参数
    #   - choices参数来判断性别显示
    gender_choices = (
        (1, '男'),
        (2, '女')
    )
    gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)


class PrettyNumber(models.Model):
    """
    靓号管理
    """
    mobile = models.CharField(verbose_name='号码', max_length=11)
    price = models.DecimalField(verbose_name='价格', max_digits=10, decimal_places=2, default=0, null=True, blank=True)
    level_choices = (
        (1, '1级靓号'),
        (2, '2级靓号'),
        (3, '3级靓号'),
        (4, '4级靓号'),
        (5, '5级靓号'),
    )
    level = models.SmallIntegerField(verbose_name='靓号级别', choices=level_choices, default=1)

    status_choices = (
        (True, '已占用'),
        (False, '未占用'),
    )
    status = models.BooleanField(verbose_name='状态', choices=status_choices, default=False)


class Admin(models.Model):
    """
    管理员表
    verbose_name：注解
    """
    username = models.CharField(verbose_name='管理员', max_length=32)
    password = models.CharField(verbose_name='密码', max_length=64)

    # 返回管理员的姓名,此功能在task.py中使用了,不然下拉框显示的就是对象
    def __str__(self):
        return self.username


class Task(models.Model):
    """ 任务
    主要为了测试ajax的使用
    """
    level_choice = {
        (1, '特提'),
        (2, '平急'),
        (3, '一般'),
    }
    level = models.SmallIntegerField(verbose_name='级别', choices=level_choice, default=3)
    title = models.CharField(verbose_name='标题', max_length=64)
    detail = models.TextField(verbose_name='详细信息')
    # CASCADE 级联删除
    # to 关联表
    # to_field 可不用写
    user = models.ForeignKey(verbose_name='任务负责人', to='Admin', to_field='id', on_delete=models.CASCADE)


class Order(models.Model):
    """ 订单 """
    oid = models.CharField(verbose_name='订单号', max_length=64)
    title = models.CharField(verbose_name='商品名称', max_length=64)
    price = models.IntegerField(verbose_name='价格')
    status_choice = {
        (1, '待支付'),
        (2, '已支付'),
    }
    status = models.SmallIntegerField(verbose_name='状态', choices=status_choice, default=1)
    # 设置级联删除
    user = models.ForeignKey(verbose_name='订单用户', to='Admin', on_delete=models.CASCADE)


class Boss(models.Model):
    """ 一个测试使用的表，用于测试文件上件使用 基于 Form"""

    name = models.CharField(verbose_name='姓名', max_length=64)
    age = models.IntegerField(verbose_name='年龄')
    img = models.CharField(verbose_name='头像', max_length=128)


class City(models.Model):
    """ 一个测试使用的表，用于测试文件上件使用 基于modelForm """

    name = models.CharField(verbose_name='城市', max_length=64)
    count = models.IntegerField(verbose_name='人口')
    # 本质上还是CharField，区别在于上传文件并保存的事情由Django来做不需要写代码
    # upload_to 是保存的文件夹名称，是media目录中已存在的目录
    img = models.FileField(verbose_name='Logo', max_length=128,upload_to='upload/')
